home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / rhythm / rhythm.c < prev    next >
Text File  |  1995-03-16  |  5KB  |  246 lines

  1. /***************************************************
  2.     Rhythm de Pon !! version 1.41421356
  3.                 copyleft 1995 Yamasyn.
  4.                     ++  compile for gcc only
  5. ****************************************************/
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <ctype.h>
  10. #include <string.h>
  11. #include <time.h>
  12. #include <sys/extender.h>
  13.  
  14. #define ON  1
  15. #define OFF 0
  16.  
  17. int part=10,port=0,key[256],vel[256];
  18.  
  19. typedef struct {
  20.     clock_t tc;
  21.     unsigned char   key;
  22. }SMFBUF;
  23.  
  24. SMFBUF *smfbuf;
  25. int smfbufSize=65535,smfbufNum=0,smfMake;
  26.  
  27. FILE *fpi,*fpo;
  28.  
  29. char smfHeader[]=    /* GCCでは分解能50 */
  30. {'M','T','h','d',0,0,0,6,0,0,0,1,0
  31. ,CLOCKS_PER_SEC/2,'M','T','r','k',0,0,0,0};
  32.  
  33. char *title=
  34. "\n"
  35. " ******************* RHYTHM de PON ********************\n"
  36. "  KEY  :INSTRUMENT\n";
  37.  
  38.  
  39. /* MIDI library                 -- midilib.o */
  40. int MIDI_init(int);     /* MIDI 初期化       */
  41. int MIDI_putch(int);    /* MIDI 1バイト送信 */
  42. int MIDI_restore(void); /* MIDI 終了         */
  43.  
  44. int key_check(void)
  45. {
  46. /*
  47.     union REGS rg;
  48.     rg.h.ah = 0x06;
  49.     rg.h.dl = 0xff;
  50.     intdos( &rg,&rg );
  51.     return((rg.h.al != 0)? rg.h.al: -1);
  52. */
  53.     return(_dos_direct_console_input());
  54. }
  55. void config(void)
  56. {
  57.     char buf[256],*s;
  58.     static char *cfg_cmd[] = { "PORT","PART","SMFBUF","KEY" };
  59.     int i,n=-1,l=0,m;
  60.  
  61.     if ((fpi=fopen("RHYTHM.CFG","r")) == NULL) {
  62.         printf("'RHYTHM.cfg'が読めません\n");
  63.         exit(EXIT_FAILURE);
  64.     }
  65.     while (fgets(buf,sizeof buf,fpi) != NULL) {
  66.         l++;
  67.         *(strchr(buf,'\n')) = '\0';
  68.         if((s=strchr(buf,';')) != NULL) *s='\0';
  69.         s=buf;
  70.         while (*s == ' ' || *s == '\t') s++;
  71.         if(*s == '\0')  continue;
  72.         for (i=0;i<4;i++) {
  73.             if(strncmp(s,cfg_cmd[i],strlen(cfg_cmd[i])) == 0) {
  74.                 n=i;
  75.                 break;
  76.             }
  77.         }
  78.         if (n == -1) {
  79.             printf("'RHYTHM.cfg'の %d 行に定義エラー\n",l);
  80.             exit(EXIT_FAILURE);
  81.         }
  82.         s+=strlen(cfg_cmd[n]);
  83.         while (*s == ' ' || *s == '\t') s++;
  84.         switch(n) {
  85.         case 0:
  86.             if((port=toupper(*s)-'A')<0 || port>7) {
  87.                 printf("MIDIポート指定に誤りがあります\n");
  88.                 exit(EXIT_FAILURE);
  89.             }
  90.             break;
  91.         case 1:
  92.             if((part=atoi(s)-1)<0 || part>15) {
  93.                 printf("パート指定に誤りがあります\n");
  94.                 exit(EXIT_FAILURE);
  95.             }
  96.             break;
  97.         case 2:
  98.             smfbufSize=atoi(s);
  99.             break;
  100.         case 3:
  101.             if(*s==0x27 && *(s+2)==0x27) {
  102.                 m=*(s+1);
  103.                 s+=3;
  104.             }
  105.             else    m=atoi(s);
  106.             s=strchr(s,',');
  107.             m=toupper(m);      /* ここらへんはチェックしていない */
  108.             key[m]=atoi(++s);  /* 手抜き */
  109.             s=strchr(s,',');
  110.             vel[m]=atoi(++s);
  111.             s=strchr(s,',');
  112.             printf("  '%c'  :%s\n",m,++s);
  113.             break;
  114.         }
  115.     }
  116.     fclose(fpi);
  117.     return;
  118. }
  119. void record(int n)
  120. {
  121.     clock_t t;
  122.     t=clock();
  123.     if(smfbufSize <= (smfbufNum+1)*sizeof(SMFBUF)) {
  124.         printf("SMFバッファが足りません");
  125.         exit(EXIT_FAILURE);
  126.     }
  127.     smfbuf[smfbufNum].tc=t;
  128.     smfbuf[smfbufNum].key=(unsigned char)n;
  129.     smfbufNum++;
  130. }
  131.  
  132. void note_on(int part,int note,int vel)
  133. {
  134.     MIDI_putch((0x90+part)&0xff);
  135.     MIDI_putch(note & 0x7f);
  136.     MIDI_putch(vel & 0x7f);
  137.  
  138.     return;
  139. }
  140.  
  141. void key_main(void)
  142. {
  143.     int c;
  144.     for(;;) {
  145.         while ((c=key_check()) == -1);
  146.         if (c == 13)    break;
  147.         c=toupper(c);
  148.         if(key[c] == -1)    continue;
  149.         note_on(part,key[c],vel[c]);
  150.         if (smfMake == ON)    record(c);
  151.     }
  152.     return;
  153. }
  154.  
  155. int putvar(unsigned long n)
  156. {
  157.     int i,d[4],flags=0,ret=0;
  158.  
  159.     for(i=0;i<4;i++)
  160.         d[i]=(int)((n>>(i*7))&0x7f);
  161.  
  162.     for(i=3;i>=0;i--)
  163.     {
  164.         if(flags==0 && d[i]==0 && i!=0) continue;
  165.         flags=1;
  166.         fputc(((i==0)?d[i]:d[i]|0x80),fpo);
  167.         ret++;
  168.     }
  169.     return(ret);
  170. }
  171.  
  172. void putSize(unsigned long dataSize)
  173. {
  174.     int d1,d2,d3,d4;
  175.  
  176.     d1=(int)((dataSize&0xff000000)>>24);
  177.     d2=(int)((dataSize&0xff0000)>>16);
  178.     d3=(int)((dataSize&0xff00)>>8);
  179.     d4=(int)(dataSize&0xff);
  180.  
  181.     fputc(d1,fpo);
  182.     fputc(d2,fpo);
  183.     fputc(d3,fpo);
  184.     fputc(d4,fpo);
  185. }
  186.  
  187. int main(int argc,char *argv[])
  188. {
  189.     int c,i;
  190.     clock_t t1,t2,t3;
  191.     unsigned long d;
  192.  
  193.     if (argc != 1) {
  194.         smfMake=ON;
  195.         if ((fpo=fopen(argv[1],"wb")) == NULL) {
  196.             printf("'%s'が作成できません\n",argv[1]);
  197.             exit(EXIT_FAILURE);
  198.         }
  199.     } else smfMake=OFF;
  200.  
  201.     for(i=0;i<256;i++) {
  202.         key[i]=-1;
  203.         vel[i]=127;
  204.     }
  205.     printf(title);
  206.     config();
  207.     printf("[RET]:EXIT\n");
  208.     MIDI_init(port);
  209.     if((smfbuf=malloc(smfbufSize)) == NULL) {
  210.         printf("SMFバッファが確保できません\n");
  211.         exit(EXIT_FAILURE);
  212.     }
  213.     if (smfMake == ON)      printf("*** RECORDING NOW ***\n");
  214.     t1=clock();
  215.     key_main();
  216.     if (smfMake == ON) {
  217.         for (i=0;i<22;i++)      fputc(smfHeader[i],fpo);
  218.         fputc(0x00,fpo);
  219.         fputc(0xff,fpo);
  220.         fputc(0x51,fpo);
  221.         fputc(0x03,fpo);
  222.         fputc(0x07,fpo);
  223.         fputc(0xa1,fpo);
  224.         fputc(0x20,fpo);
  225.         for (i=0;i<smfbufNum;i++) {
  226.             t3=smfbuf[i].tc;
  227.             t2=t3-t1;
  228.             t1=t3;
  229.             putvar(t2);
  230.             if (i==0) fputc(0x90+part,fpo);
  231.             c=smfbuf[i].key;
  232.             fputc(key[c],fpo);
  233.             fputc(vel[c],fpo);
  234.         }
  235.         fputc(0x00,fpo);
  236.         fputc(0xff,fpo);
  237.         fputc(0x2f,fpo);
  238.         fputc(0x00,fpo);
  239.         d=ftell(fpo)-22L;
  240.         fseek(fpo,18L,SEEK_SET);
  241.         putSize(d);
  242.         fclose(fpo);
  243.     }
  244.     return(0);
  245. }
  246.